package com.cskaoyan.javase.oop3._1interface._1basic;

/**
 * 自此，我们已经引入了接口的概念。接下来，我们重点来研究一个接口的特点和使用。
 * 接口的特点我们主要研究以下方面
 *      1.接口的声明特点
 *          接口的声明首先注意,可以使用访问权限修饰符,和class的声明是一样的
 *          接口的声明列表默认就存在abstract关键字
 *          接口默认就是抽象的,接口是不能创建对象实例化的(和抽象类一样)
 *
 *          抽象类和接口一样,定义出来都是为了继承和实现的
 *          所以它们都是不能用final修饰的
 *
 *          注:
 *          接口中隐含存在的修饰符不要写出来,不要画蛇添足
 *
 *
 *      2.接口的实现类的书写格式
 *          接口的命名很多程序员喜欢用"I"开头
 *          也有很多程序员在写接口的实现类时
 *              直接在接口所处包下定义包"impl"
 *              然后在该包下写实现类"接口名 + Impl"
 *              表示它是某个接口的实现类
 *          以上写法很常见.
 *
 *       3.接口的成员特点:
 *          a.接口中能定义的属性
 *              接口中只能定义:
 *              "公共的全局常量"
 *              接口中定义属性
 *              默认就是"public static final"
 *              修饰的
 *
 *              这些默认的修饰符没有必要写出来
 *
 *              注:
 *              所有接口中能够定义的结构
 *              访问权限修饰符一律默认为public
 *              而且是不可更改的
 *
 *              特别注意:
 *              1.接口中定义属性,一律直接写数据类型 名字即可,不要写出隐含的修饰符.
 *              2.接口中的全局常量的赋值,必须是,也只能是显式赋值
 *                  因为接口中没有静态代码块
 *
 *              3.接口表示行为/功能的扩展,往往只表示对行为的抽象
 *                  所以接口中绝大多数情况下,是不会定义属性的
 *                  也建议不要随便就在接口中定义全局常量.
 *                  只有一种情况需要在接口中定义属性:
 *                  当接口的所有实现类,都必须使用同一个全局常量时
 *                  这时可以把这个全局常量定义在接口中.
 *
 *          b.接口中能定义的行为
 *              在Java8之前
 *              接口中的所有方法,默认都是"public abstract"
 *              修饰的"公共的"抽象方法
 *
 *              当然接口中定义行为,定义抽象方法,禁止把"public abstract"写出来
 *              接口中定义的抽象方法,同样需要普通子类去实现它,而且是必须全部实现.
 *
 *         c.接口中能不能定义构造器?
 *         没有构造器
 *         接口不需要构造器
 *
 *          总结:
 *          接口和类是大不相同的
 *          接口中能够定义全局常量
 *          也可以定义抽象方法
 *          但实际上绝大多数情况下
 *          见到的接口
 *          接口中只会定义抽象方法
 *
 *  接口的子类特点
 *  接口的子类(实现类)允许是:
 *      1.普通类,必须实现接口中的所有抽象方法
 *      2.抽象类,不需要实现抽象方法,也可以选择实现
 *      3.接口,这时是继承关系,一个接口继承另外一个接口
 *      就会得到父接口中的属性和行为.
 *
 * 总结一下，接口和类的继承/实现的规则：
 *      1.继承（extends）是不能跨越种族的，类和类继承，接口和接口继承，接口和类之间没有继承关系。
 *       普通类继承一个抽象类，需要实现里面的所有抽象方法。
 *      抽象类继承一个抽象类，按需实现里面的抽象方法。
 *      抽象类继承一个普通类，是可以的。
 *      接口在继承一个接口后，会得到接口的所有抽象方法。
 *      类的继承是单继承的，接口的继承是多继承的。
 *
 *      2.实现（implements），必须发现在类与接口之间，而且是类实现接口,接口和类是没有任何关系的。
 *      普通类实现接口，必须实现所有抽象方法
 *      抽象类实现接口，按需实现抽象方法
 *
 * @since 09:57
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public interface ITest {
    // 定义属性
    // Variable 'a' might not have been initialized
    int a = 10;
    // Variable 'b' might not have been initialized
    // Modifier 'static' is redundant for interface fields
    static int b = 20;
    // Modifier 'final' is redundant for interface fields
    // Modifier 'public' is redundant for interface fields
    public static final int C = 30;
}

interface IA {
    // 如果真的要在接口中定义属性,应该采取以下方式
    int a = 10;
    String str = "abc";

    // 要在接口中定义抽象方法,应该采取以下格式
    void test();

    String test2(int a);

    void test3(int a, int b);

}

interface IB {
    void test4();

    void test5(int a);
}

abstract class A implements IA {

}

interface IC extends IA, IB {
}
// Modifier 'abstract' is redundant for interfaces
// public abstract interface ITest {
// }
